/**
 * 
 */
package com.kclmedu.forhelp.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


/**
 * 读取指定的Excel文档内容，并包装成
 * @author Administrator
 *
 */
public class ReadExcelFileUtil {

	private static final Logger LOGGER = Logger.getLogger(ReadExcelFileUtil.class);
	
	/***********************
	 * 读取指定的Excel中的内容
	 * @param excelPath
	 */
	public static List<List<String>> readExcel(String excelPath) {
		//
		List<List<String>> datas = new ArrayList<>();
		//
		File file = new File(excelPath);
		//判断
		if(!file.exists() || file.isDirectory()) {
			//记录日志
			LOGGER.error("文件不存在或是一个目录: "+excelPath);
			throw new RuntimeException("文件不存在或者不是一个合法的文件");
		}
		//获取扩展名
		String fileType = excelPath.substring(excelPath.lastIndexOf(".")+1);
		LOGGER.debug("读取的文件完整路径是："+file.getAbsolutePath());
		LOGGER.debug("文件扩展名： "+fileType);
		//读取Excel
		InputStream in = null;
		//
		Workbook wb = null;
		try {
			in = new FileInputStream(file);
			//根据文件扩展名来创建不同的  Workbook
			if(fileType.equals("xls")) { 
				//针对 excel 2003及以下的版本
				wb = new HSSFWorkbook(in);
				//日志
				LOGGER.debug("读取的目标EXCEL文件是2003及其以下的版本，使用HSSFWorkbook类型");
			} else if(fileType.equals("xlsx")) {
				//针对Excel 2007及其以上的版本
				wb = new XSSFWorkbook(in);
				//日志
				LOGGER.debug("读取的目标EXCEL文件是2007及其以上的版本，使用XSSFWorkbook类型");
			} else {
				//日志
				LOGGER.error("文件的扩展名不正确，这是不是一个合法的Excel文件扩展名: "+fileType);
				//返回结束
				return null;
			}
			//开始读取 sheet中的内容
			Sheet sheet = wb.getSheetAt(0); //读取第一个sheet中的内容
			LOGGER.debug("读取的Sheet名是："+sheet.getSheetName());
			//第一行为标题，全部读取
			for(Row row : sheet) {
				//每一行的内容封装到一个 List 中
				List<String> contentList = new ArrayList<>();
				LOGGER.info("处理第【"+datas.size()+"】行");
				//再把此行中的 单元格迭代出来
				for(Cell cell : row) {
					//把cell的内容都当字符串来读取
					String cellContent = null;
					//获取单元格的数据类型
					CellType cellType = cell.getCellTypeEnum();
					//获取数据不类型的不同，来调用不同的方法获取值
					switch (cellType) {
					case STRING:
//						cellContent = cell.getStringCellValue();
						cellContent = cell.getRichStringCellValue().getString();
						
						break;
					case NUMERIC:
						LOGGER.debug("单元格类型为NUMERIC类型，显示时需要格式化为字符串");
						//进一步获取 数据格式字符串
						LOGGER.debug(" >>> "+cell.getCellStyle().getDataFormatString());
//						cellContent = String.valueOf(cell.getNumericCellValue());
						//进一步判断是否是日期格式
						if(HSSFDateUtil.isCellDateFormatted(cell)) {
							//如果是日期的话，则格式化日期 
							SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
							cellContent = sdf.format(cell.getDateCellValue());
						} else if("General".equals(cell.getCellStyle().getDataFormatString())){
							//如果是数字的话，则格式化成数字，此处会把格式化的货币符号去掉了
							cellContent = new DecimalFormat("#").format(cell.getNumericCellValue());
						} else if("\\$#,##0.00;\\-\\$#,##0.00".equals(cell.getCellStyle().getDataFormatString())) {
							//格式化成 带货币符号的,统一为美元
							cellContent = NumberFormat.getCurrencyInstance(Locale.US).format(cell.getNumericCellValue());
						}
						break;
					case BOOLEAN:
						cellContent = String.valueOf(cell.getBooleanCellValue());
						break;
					case BLANK:
						LOGGER.debug("单元格类型为BLANK类型，内容为空白字符 ");
						cellContent = "";
						break;
					case FORMULA:
						LOGGER.debug("单元格类型为FORMULA类型，也就是公式");
						cellContent = cell.getCellFormula();
						break;
					case ERROR:
						LOGGER.error("错误的单元格类型，有非法字符...");
						cellContent = "";
						break;
					default:
						LOGGER.warn("没有匹配单元格类型，内容置为空");
						cellContent = "";
						break;
					}
					//日志
					LOGGER.info("\\-元单格【"+contentList.size()+"】内容："+cellContent);
					//添加到contentList中
					contentList.add(cellContent);
				}
				//把每一行对应的List添加到更大的List中
				datas.add(contentList);
				LOGGER.debug("已处理的行数: " + datas.size());
			}
			//为了在表格的最上面生成一行复选框，人为添加一个全是 boolean数据的List集合
			/*List<String> booleanList = new ArrayList<>();
			for(int i = 0; i < datas.get(0).size();i++) {
				booleanList.add("false");
			}
			//
			datas.add(0, booleanList);*/
			//
			LOGGER.debug("共计："+datas.size());
		} catch (IOException e) {
			//记录日志
			LOGGER.error("获取文件流失败", e);
			e.printStackTrace();
		} finally {
			//
			if(wb != null){
                try{
                    wb.close();
                    LOGGER.debug("释放 Workbook资源成功.");
                }catch(IOException ee){
                    LOGGER.error("释放 Workbook资源失败.",ee);
                }
            }
		}
		
		//返回
		return datas;
	}
	
}
